﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.IO;
using System.Drawing;
using System.Globalization;
using System.ComponentModel;
using System.Data;
using System.Windows.Forms;


namespace ProyectoPractico
{
    class MapField
    {

        //ATRIBUTOS*****************************************************************************************
        private struct mapa
        {
            public int artA;
            public int artB;
        }

        private List<mapa> mapas;
        private List<String> categorias;

        //int cantidad = 0;
        /*
         * Constructor de la clase
         */
        public MapField()
        {
            mapas = new List<mapa>();
            categorias = new List<String>();
        }

        /**
         * Metodo que retorna el ID de la categoria a la que pertenece el resultA
         */
        public String getResultado(int resultA)
        {
            return resultA < mapas.Count ? categorias[mapas[resultA].artB] : "No se encuentra esta persona";
        }

        public bool mapear(String entradaB, int resultA, int resultB)
        {
            bool satisfactorio = true;
            bool encontrado = false;
            for (int i = categorias.Count - 1; i >= 0 && !encontrado; i--)
            {
                if (categorias[i].Equals(entradaB))
                {
                    encontrado = true;
                }
            }
            if (!encontrado)
            {
                categorias.Add(entradaB);
            }
            /*while(resultB != categoria){
                ejecutar de nuevo el artB cambiandole el paramV(cambiar el tipo de retorno a entero para indicar cual art no funciono bien
             * }*/
            if (resultA >= mapas.Count)
            {//si es una nueva neurona de salida en artA
                mapa mapita = new mapa();
                mapita.artA = resultA;
                mapita.artB = resultB;
                mapas.Add(mapita);
            }
            else if (mapas[resultA].artB != resultB)
            {//si no es una neurona nueva pero quiere hacer
                satisfactorio = false;                 //match con quien no le corresponde
            }
            return satisfactorio;
        }

        /*
         * Método que determina si el par de de datos
         * es mayor,menor o igual que el que entra de parámetro
       
        public int comparar()
        {
            int resultado = 0;
            if (this.artA < otro.artA)
            {
                resultado = -1;
            }
            else if (this.artA > otro.artA)
            {
                resultado = 1;
            }
            return resultado;
        }  */

        public int getCantCategorias()
        {
            return this.categorias.Count;
        }

        /*
         * 
         */
        public void guardarEnArch(string nombreArch)
        {
            try
            {
                FileStream fileStream = new FileStream(nombreArch, FileMode.Create, FileAccess.Write);
                StreamWriter archivo = new StreamWriter(fileStream);

                string cantMapas = mapas.Count.ToString();
                string cantCategorias = categorias.Count.ToString();
                
                archivo.WriteLine(cantMapas);
                archivo.WriteLine(cantCategorias);
                string guardar;
                for (int i = 0; i < mapas.Count; i++)
                {
                    guardar = ((mapa)mapas[i]).artA.ToString();
                    archivo.WriteLine(guardar);
                    guardar = ((mapa)mapas[i]).artB.ToString();
                    archivo.WriteLine(guardar);
                }                
                for (int j = 0; j < categorias.Count; j++)
                {
                    guardar = (String)categorias[j];
                    archivo.WriteLine(guardar);
                }
                archivo.Dispose();
                archivo.Close();
                fileStream.Close();

            }
            catch (Exception e)
            {
                MessageBox.Show("Se produjo un error con el archivo, intente nuevamente!", "Pesos", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        /*
         * 
         */
        public void cargarMapField(string arch)
        {
            try
            {
                FileStream fileStream = new FileStream(arch, FileMode.Open, FileAccess.Read);
                StreamReader archivo = new StreamReader(fileStream);
                int cantMapas = Int32.Parse(archivo.ReadLine());
                int cantCategorias = Int32.Parse(archivo.ReadLine());                
                //double valorA = 0.0;
                //double valorB = 0.0;                
                mapa mp;
                for (int i = 0; i < cantMapas;i++ ) {
                    mp = new mapa();
                    mp.artA = Int32.Parse(archivo.ReadLine());
                    mp.artB = Int32.Parse(archivo.ReadLine());
                    //id = archivo.ReadLine();
                    this.mapas.Add(mp);
                    //this.categorias.Add(id);
                }
                String id = "";
                for (int j = 0; j < cantCategorias; j++)
                {
                    //string guardar = (String)categorias[j];
                    //archivo.WriteLine(guardar);
                    id = archivo.ReadLine().ToString();
                    this.categorias.Add(id);
                }


            }catch(Exception e){
            
            }
        }

    }
}
